
import java.util.Stack;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author yuri
 */
public class BuscaCega {

    StringBuffer sb = new StringBuffer();
    
    public Nodo buscaEmProfundidadeIterativa(Nodo nodoProblema){
        int cont=0;
        Nodo resultado = null;
        do{
            resultado = buscaEmProfundidadeLimitada(nodoProblema, ++cont);
            System.out.println("busca na profundidade: "+cont);
        System.out.println("\nnodos gerados: "+Nodo.getDescendentes());
        Nodo.setDescendentes(0);
            
        }
        while(resultado==null);
        return resultado;
    }
    
    public Nodo buscaEmProfundidadeLimitada(Nodo nodoProblema, int limite) {
        return buscaEmProfundidadeLimitadaRecursiva(nodoProblema, limite);
    }

    private Nodo buscaEmProfundidadeLimitadaRecursiva(Nodo nodo, int limite) {
        boolean corteOcorreu = false;
        if (nodo.isObjetivo()) {
            return nodo;
        } else if (nodo.getProfundidade() == limite) {
            return null;//corte

        } else {
            Stack s = nodo.expandir(nodo);
            while (!s.isEmpty()) {
                Nodo resultado = (Nodo) s.pop();
//                System.out.println(resultado);
                resultado = buscaEmProfundidadeLimitadaRecursiva(resultado, limite);
                if (resultado == null) {
//                    System.out.println("corte ocorreu na profundidade = " + (nodo.getProfundidade()+1));
                    corteOcorreu = true;
                } else {
                    return resultado;
                }
            }
        }
        return null;
    }
}
